package uni.edu.pe.analisisSentimental.dao.impl;

import static uni.edu.pe.analisisSentimental.common.Constantes.FLAG_EN_PROCESO;
import static uni.edu.pe.analisisSentimental.common.Constantes.FLAG_POR_PROCESAR;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.sql.DataSource;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import org.springframework.jdbc.core.namedparam.SqlParameterSourceUtils;
import org.springframework.jdbc.core.simple.SimpleJdbcTemplate;
import org.springframework.stereotype.Repository;

import uni.edu.pe.analisisSentimental.dao.StatusTweetDAO;
import uni.edu.pe.analisisSentimental.domain.StatusTweet;

@Repository
public class StatusTweetDAOImpl implements StatusTweetDAO{

    private static Logger logger = LoggerFactory.getLogger(StatusTweetDAOImpl.class);
	private static final boolean isDebugEnabled = logger.isDebugEnabled();

	// SimpleJdbcTemplate-style...
	private SimpleJdbcTemplate simpleJdbcTemplate;

	@Autowired
	public void setDataSource(DataSource dataSource) {
	    this.simpleJdbcTemplate = new SimpleJdbcTemplate(dataSource);
	}
	
	/*
	 * (non-Javadoc)
	 * @see uni.edu.pe.analisisSentimental.dao.StatusTweetDAO#save(uni.edu.pe.analisisSentimental.domain.StatusTweet)
	 */
	public void save(StatusTweet tb) {
		logger.debug("<==== Inicio save ====>");	
		if(isDebugEnabled)
			logger.debug("StatusTweet: "+ToStringBuilder.reflectionToString(tb));
		String sql =  "INSERT INTO STATUS_TWEET (IdTweet, TextoConsulta, TextoMensaje, NombrePantallaRemitente, ContadorRetweets, CodOpinionInicial, CodIdioma, FechaHoraRegistro, FlagEnProceso, CodFinalidadData)"+
	    "VALUES(:idTweet, :textoConsulta, :textoMensaje, :nombrePantalla, :contadorRetweets, :codOpinionInicial, :codIdioma, :fechaHoraRegistro, :flagEnProceso, :codFinalidadData)";
		Map<String, Object> parameters = new HashMap<String, Object>();
		parameters.put("idTweet", tb.getId());
		parameters.put("textoConsulta", tb.getQuery());
		parameters.put("textoMensaje", tb.getMensaje());
		parameters.put("nombrePantalla", tb.getScreenNameUser());
		parameters.put("contadorRetweets", tb.getContadorRetweets());
		parameters.put("codOpinionInicial", tb.getCodOpinionInicial());
		parameters.put("codIdioma", tb.getCodIdioma());
		parameters.put("fechaHoraRegistro", tb.getFechaHoraRegistro());
		parameters.put("flagEnProceso", tb.getFlagEnProceso());
		parameters.put("codFinalidadData", tb.getCodFinalidadData());
		simpleJdbcTemplate.update(sql,parameters);
	    
	}

	/*
	 * (non-Javadoc)
	 * @see uni.edu.pe.analisisSentimental.dao.StatusTweetDAO#obtenerContadorEntradasDelTweetEnBD(java.lang.Long)
	 */
	public int obtenerContadorEntradasDelTweetEnBD(Long idTweet) {
		logger.debug("<==== Inicio Method insertTweet ====>");
		String sql = "SELECT COUNT(*) FROM STATUS_TWEET WHERE IdTweet = :id";
		Map<String, Object> parameters = new HashMap<String, Object>();
		parameters.put("id", idTweet);
	    return simpleJdbcTemplate.queryForInt(sql, parameters);
	}
	
	
	/*
	 * (non-Javadoc)
	 * @see uni.edu.pe.analisisSentimental.dao.StatusTweetDAO#obtenerTweetsPorProcesar()
	 */
	public List<StatusTweet> obtenerTweetsPorProcesar(String codFinData){
		logger.debug("<==== Inicio Method obtenerTweetsPorProcesar ====>");
		String sql = "SELECT IdTweet, TextoMensaje FROM STATUS_TWEET WHERE FlagEnProceso = :flagEnProceso and CodFinalidadData = :codFinalidadData";
		Map<String, Object> parameters = new HashMap<String, Object>();
		parameters.put("flagEnProceso", FLAG_POR_PROCESAR);
		parameters.put("codFinalidadData", codFinData);
		 RowMapper<StatusTweet> mapper = new RowMapper<StatusTweet>() {  
		        public StatusTweet mapRow(ResultSet rs, int rowNum) throws SQLException {
		        	StatusTweet st = new StatusTweet();
		            st.setId(rs.getLong("IdTweet"));
		            st.setMensaje(rs.getString("TextoMensaje"));		
		            return st;
		        }
		    };

	    return this.simpleJdbcTemplate.query(sql, mapper, parameters);

	}

	/*
	 * (non-Javadoc)
	 * @see uni.edu.pe.analisisSentimental.dao.StatusTweetDAO#updatePasadosProceso(java.util.List)
	 */
	public void updatePasadosProceso(List<StatusTweet> lst) {
		logger.debug("<==== Inicio Method updatePasadosProceso ====>");
		if(CollectionUtils.isNotEmpty(lst)){
			for(StatusTweet st: lst){
				updatePasoProceso(st);
			}			
		}		
	}
	
	/*
	 * (non-Javadoc)
	 * @see uni.edu.pe.analisisSentimental.dao.StatusTweetDAO#updatePasadosProcesoBatch(java.util.List)
	 */
	public int[] updatePasadosProcesoBatch(List<StatusTweet> lst) {
		logger.debug("<==== Inicio Method updatePasadosProcesoBatch ====>");
		int[] updateCounts = null;
		if(CollectionUtils.isNotEmpty(lst)){
			int size = lst.size();			
			Map[] tpdtos = new HashMap[size];
			for(int i=0;i<size;i++){
				StatusTweet st  = lst.get(i);
				Map<String, Object> parameters = new HashMap<String, Object>();
				parameters.put("flagEnProceso", FLAG_EN_PROCESO);
				parameters.put("idTweet", st.getId());
				tpdtos[i]=parameters;
			}
			SqlParameterSource[] batch = SqlParameterSourceUtils.createBatch(tpdtos);
			String sql =  "UPDATE STATUS_TWEET set FlagEnProceso = :flagEnProceso where IdTweet = :idTweet";
			updateCounts = simpleJdbcTemplate.batchUpdate(sql,batch);	
			tpdtos =null;
			batch=null;		
		}
		return updateCounts;
	}
	/*
	 * (non-Javadoc)
	 * @see uni.edu.pe.analisisSentimental.dao.StatusTweetDAO#updatePasoProceso(uni.edu.pe.analisisSentimental.domain.StatusTweet)
	 */
	public void updatePasoProceso(StatusTweet st){
		logger.debug("<==== Inicio Method updatePasoProceso ====>");
		if(isDebugEnabled)
			logger.debug("StatusTweet: "+ToStringBuilder.reflectionToString(st));
		String sql =  "UPDATE STATUS_TWEET set FlagEnProceso = :flagEnProceso where IdTweet = :idTweet";
		Map<String, Object> parameters = new HashMap<String, Object>();
		parameters.put("flagEnProceso", FLAG_EN_PROCESO);
		parameters.put("idTweet", st.getId());
		simpleJdbcTemplate.update(sql,parameters);
	}


}
